home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 108_01 / list.c < prev    next >
Text File  |  1985-11-13  |  5KB  |  177 lines

  1.  
  2. /**********************************************************
  3.  ***                            ***
  4.  ***    Copyright (c) 1981 by David M. Fogg        ***
  5.  ***                            ***
  6.  ***        2632 N.E. Fremont            ***
  7.  ***        Portland, OR 97212            ***
  8.  ***                            ***
  9.  ***        (503) 288-3502{HM} || 223-8033{WK}        ***
  10.  ***                            ***
  11.  ***    Permission is herewith granted for non-     ***
  12.  ***    commercial distribution through the BDS C    ***
  13.  ***    User's Group; any and all forms of commercial   ***
  14.  ***    redistribution are strenuously unwished-for.    ***
  15.  ***                            ***
  16.  **********************************************************/
  17.  
  18. /*
  19.       ---> TEXT FILE LISTING PROGRAM <---
  20.  
  21.    Coded by David M. Fogg @ New Day Computing Co., Portland, OR
  22.  
  23.      *** (C) COPYRIGHT 1980, New Day Computing Co. ***
  24.  
  25.    24 OCT 80: creation day
  26.    5 Nov - add optional line numbering
  27.    6 NOV - Chg to xpand tabs
  28.    21 Nov: Filter Form Feeds
  29.    8 Jan 81: add line folding & opt line length spec
  30.    6 Mar: chg DEFLL->128; chg puts->printf 2 show actual DEFLL
  31.  
  32.     USAGE: list filnam "Title String"  {list a single file}
  33.        list [no arguments]     {list multiple files: title/filnam prompts}
  34.         [no arguments] allows changing:
  35.                  line numbering   (default: NO)
  36.                  line length      (default: 70)
  37.                  initial formfeed (default: NO)
  38.  
  39. */
  40.  
  41. #include <std.h>
  42.  
  43. #define MAXF   64    /* MAX # OF FILES */
  44. #define MAXFNL 15    /* MAX FILNAM LENGTH (INCL NUL TERMINATOR) */
  45. #define MAXLNS 60    /* MAX LINES/PAGE */
  46. #define NSTARS 85    /* # OF ASTERISKS IN STAR LINE */
  47. #define TABX    8    /* TAB EXPANSION MODULUS */
  48. #define DEFLL  128    /* DEFAULT LINE LENGTH */
  49.  
  50. main (argc, argv)
  51. int argc;
  52. char *argv[];
  53. {
  54.    char fnbuf[MAXFNL*MAXF];     /* file name buffer */
  55.    char *pfnbuf;         /* pointo curr pos in fnbuf */
  56.    char *filnam[MAXF];         /* file names (pointers) */
  57.    char titbuf[100];         /* page title (usu. incl. date) buffer */
  58.    char *titl;             /* pointer to title */
  59.    char stars[NSTARS+1];     /* asterisk line */
  60.    int fno;             /* file # being listed */
  61.    int nfils;             /* no. of files to list */
  62.    int pagno;             /* curr page # */
  63.    int lino;             /* curr line # on page */
  64.    char iobuf[BUFSIZ];         /* file I/O buffer */
  65.    int filopn;             /* holds fopen result */
  66.    char lbuf[MAXLINE];         /* input line buffer */
  67.    BOOL dilin;             /* whether to disp line #s */
  68.    int lines;             /* tot lines in curr file */
  69.    int linlen;             /* maximum line length */
  70.  
  71.    pfnbuf = fnbuf;
  72.    titl = titbuf;
  73.    setmem(stars, NSTARS, '*'); stars[NSTARS] = '\0';
  74.    dilin = NO;
  75.    linlen = DEFLL;
  76.  
  77.    if (argc > 1) {
  78.       nfils = 1;
  79.       filnam[0] = *++argv;
  80.       if (argc > 2)
  81.      titl = *++argv;
  82.       else
  83.      titbuf[0] = '\0';
  84.    }
  85.    else {
  86.       dilin = getyn(0, 0, "Line Numbers");
  87.       printf("Line Length (%d): ", DEFLL);
  88.       scanf("%d", &linlen); if (linlen < 1) linlen = DEFLL;
  89.       puts("\nTitle: "); gets(titl);
  90.       nfils = 0;
  91.       do {
  92.      printf("File # %2d : ", nfils + 1);
  93.      filnam[nfils] = gets(pfnbuf);
  94.      pfnbuf += strlen(pfnbuf) + 1;
  95.       } while (strlen(filnam[nfils++]) > 0 && nfils < MAXF);
  96.       --nfils;
  97.       if (nfils == 0)
  98.      errxit("Nothing to do...quitting");
  99.       puts("\nWant a Formfeed? ");
  100.       if (toupper(getchar()) == 'Y') putc(FFEED, LST);
  101.       putchar('\n');
  102.    }
  103.  
  104.  
  105. /*
  106.      >>------> MAIN PRINT LOOP <------<<
  107. */
  108.  
  109.    for (fno = 0; fno < nfils; ++fno) {
  110.       if ((filopn = fopen(filnam[fno], iobuf)) == ERROR) {
  111.      printf("*** File I/O Error: %-15s\n", filnam[fno]);
  112.      continue;
  113.       }
  114.       pagno = 0; lines = 0;
  115.       lino = MAXLNS + 3;
  116.       printf("---> Now listing %-15s\n", filnam[fno]);
  117.       while (fgets(lbuf, iobuf) != 0) {
  118.      if (lino > MAXLNS) {
  119.         if (pagno == 0) {
  120.            if (fno > 0) putc(FFEED, LST);
  121.            fputs(stars, LST); fputs("\n", LST);
  122.            lino = 1;
  123.         }
  124.         else {
  125.            putc(FFEED, LST);
  126.            lino = 0;
  127.         }
  128.         fprintf(LST, "\n---> Listing of: %-15s    ", filnam[fno]);
  129.         fprintf(LST, "%-35s  ", titl);
  130.         fprintf(LST, "Page %2d <---\n", ++pagno);
  131.         lino += 2;
  132.         if (pagno == 1) {
  133.            fputs("\n", LST); fputs(stars, LST); fputs("\n", LST);
  134.            lino += 2;
  135.         }
  136.         fputs("\n\n\n", LST); lino += 3;
  137.      }
  138.      if (dilin)
  139.         fprintf(LST, "%4d: ", ++lines);
  140.      oplin(lbuf, linlen, &lino);
  141.      ++lino;
  142.       } /* while (fgets... */
  143.  
  144.       fclose(iobuf);
  145.    } /* for (fno... */
  146.  
  147.    if (filopn != ERROR) putc(FFEED, LST);
  148. } /* main() */
  149.  
  150.  
  151. oplin (lbuf, len, lno)      /* --<O/P A LINE W/ TAB XPANSION>-- */
  152. char lbuf[];
  153. int len;
  154. int *lno;
  155. {
  156.    int cpos;      /* curr printhead pos */
  157.    int i;
  158.  
  159.    cpos = 0;
  160.    for (i = 0; i < strlen(lbuf); ++i) {
  161.       if (lbuf[i] == '\n')
  162.      fputs("\n", LST);
  163.       else if (lbuf[i] == '\t') {
  164.      putc(' ', LST);
  165.      while (++cpos % TABX) putc(' ', LST);
  166.       }
  167.       else if (lbuf[i] != FFEED) {
  168.      putc(lbuf[i], LST);
  169.      if (++cpos > len) {
  170.         fputs("\\\n", LST);
  171.         cpos = 0;
  172.         ++*lno;
  173.      }
  174.       }
  175.    }
  176. }
  177.